#ifndef __BUOLA_GUI_CTOOLKIT_H__
#define __BUOLA_GUI_CTOOLKIT_H__

#include <buola/gui/cwindow.h>
#include <buola/gui/cclipboard.h>
#include <buola/gui/dnd/cdragimpl.h>
#include <buola/gui/dnd/cdropimpl.h>

namespace buola { namespace gui {

///\addtogroup gui
///@{

class CPhysicalWindow;

///////////////////////////////////////////////////////////////////////////

/// toolkit

/// encapsulates most of the low-level functionality of a window environment
///
///////////////////////////////////////////////////////////////////////////

class CToolkit : public UUncopiable
{
protected:
////////////////////////////////
// constructor and destructor
//
    CToolkit();
    virtual ~CToolkit();

public:
////////////////////////////////////////////////////////////////
////////////////////////// interface ///////////////////////////
////////////////////////////////////////////////////////////////

/////////////////
// synchronize
//
    virtual void Synchronize()=0;

///////////////////////////
// focus, grab and mouse
//
    CPoint_d GetMousePos(CWindow *pWindow=nullptr);

///////////////////////////
// root and proxy window
//
    virtual void QueryPointer(CPhysicalWindow *pWindow,CPoint_d &pInWindow,CPoint_d &pInScreen)=0;
    virtual CPhysicalWindow *GetNewPhysicalWindow(CWindow *pWindow)=0;

//////////////////////////
// clipboard management
//
    virtual CClipboard *GetClipboard(int)=0;
    virtual CDragImpl *GetDragImpl(CDrag *pDrag)    {   return nullptr; }
    virtual CDropImpl *GetDropImpl(CDrop *pDrop)    {   return nullptr; }

//////////////////
// display info
//
    virtual int GetDefaultDepth()=0;

///////////////////
// pixmap access
//
    virtual img::CSurface *GetNewPixmap(const CSize_i&,int pDepth=0,unsigned char *pData=nullptr,int pStride=0)=0;

//////////////
// keyboard
//
    virtual bool KeysEqual(const TKey &p1,const TKey &p2)=0;

    virtual bool SupportsBuolaWMExtensions() {return false; }

public:
////////////////////////////////////////
/////////////// internal ///////////////
////////////////////////////////////////
    virtual void Start();
    virtual void Finish();

////////////
// cursor
//
    virtual long GetStockCursor(CPointer::EStock pIndex)=0;
    virtual long GetCursor(unsigned char*,unsigned char*,int,int,int)=0;

/////////////////////////////
// internal focus and grab
//
public:
    virtual void GrabKey(const TKey&,EKeyMod,bool,CWindow *pWindow=nullptr)=0;
    virtual void UngrabKey(const TKey&,EKeyMod,CWindow *pWindow=nullptr)=0;

//////////////////////
// openGL GC
//
    virtual img::CGC *GetOpenGLGC()=0;
    
////////////////////////////////////
/////////////// data ///////////////
////////////////////////////////////

private:
    std::wstring mDisplayName;

private:
/////////////////////
// loop management
//
    static bool mServerDown;

protected:

    CClipboard *mClipboards[CClipboard::CB_COUNT];

////////////////////
// friend classes
//
    friend class CWindow;
    friend class CAccelerator;

    friend class CDrag;
    friend class CClipboard;
};

///@}

/*namespace gui*/ } /*namespace buola*/ }

#endif
